#pragma once
#include <string>
#include <vector>

#include "bondlib.h"

enum VSortKey {
  VBOND_NULL = -1,
  VBOND_CODE,      // 代码
  VSHORT_NAME,     // 简称
  VSHORT_NAME_EN,  // 简称
  VEXPIRY_DATE,    // 剩余期限

  VBUYVOL,                    // Bid.Vol
  VBUYPRICE,                  // Bid
  VBUYNETPRICE,               // Bid.NetPrice
  VBUYYIELD,                  // Bid.Yield
  VBUYVOL_SETTLEMENT,         // 带清算速度的Bid.Vol
  VBUYPRICE_SETTLEMENT,       // 带清算速度的Bid
  VBUYNETPRICE_SETTLEMENT,    // 带清算速度的Bid.NetPrice
  VBUYFULLPRICE_SETTLEMENT,   // 带清算速度的Bid.FullPrice
  VSELLVOL,                   // Ofr.Vol
  VSELLPRICE,                 // Ofr
  VSELLNETPRICE,              // Ofr.NetPrice
  VSELLYIELD,                 // Ofr.Yield
  VSELLVOL_SETTLEMENT,        // 带清算速度的Ofr.Vol
  VSELLPRICE_SETTLEMENT,      // 带清算速度的Ofr
  VSELLNETPRICE_SETTLEMENT,   // 带清算速度的Ofr.NetPrice
  VSELLFULLPRICE_SETTLEMENT,  // 带清算速度的Ofr.FullPrice
  VMODIFY_TIME,               // 修改时间
  VMODIFY_TIME_SETTLEMENT,    // 带清算速度的修改时间
  ///////综合最优
  V_MIXEDBP_TKNPRICE,       // taken
  V_MIXEDBP_BUYVOL,         // Bid.Vol
  V_MIXEDBP_BUYPRICE,       // Bid
  V_MIXEDBP_BUYNETPRICE,    // Bid.NetPrice
  V_MIXEDBP_BUYFULLPRICE,   // Bid.FullPrice
  V_MIXEDBP_SELLVOL,        // Ofr.Vol
  V_MIXEDBP_SELLPRICE,      // Ofr
  V_MIXEDBP_SELLNETPRICE,   // Ofr.NetPrice
  V_MIXEDBP_SELLFULLPRICE,  // Ofr.FullPrice
  V_MIXEDBP_MODIFY_TIME,    // 综合最优更新时间
  V_MIXEDBP_BID_CDC,        // bid-cdc
  V_MIXEDBP_CDC_OFR,        // cdc-ofr
  V_MIXEDBP_BID_CSI,        // bid-csi
  V_MIXEDBP_CSI_OFR,        // csi-ofr
  ///////综合最优 end
  VISSUERRATING,    // 主体评级
  VBONDRATING,      // 债项评级
  VRATING,          // 主债评级
  VCDCRATING,       // 中债隐含评级
  VCSIRATING,       // 中证隐含评级
  VCBRRATING,       // 中债资信评级
  VESTBPRICEPRE,    // 昨日中债估值
  VESTBPRICETODAY,  // 今日中债估值
  VESTBCLEPRICE,    // 中债估值净价
  VBOND_TYPE,
  VBUYCLEPRICE,
  VSELLCLEPRICE,
  VMATURITY_DATE,
  VCROSSMARKET,
  VBROKERKEY,
  INDICATIVE_PRICE,       // 参考价
  VTKNPRICE,              // 成交价
  BSVTKPRICE,             // 最优报价中的成交价
  PLANNED_ISSURE_AMOUNT,  // 计划发行量(亿)
  BID_LIMIT,              // 投标区间
  AUCTION_LIMIT,          // 标位区间
  ISSUE_START_DATE,       // 发行日
  PAYMENT_DATE,           // 缴款日
  LISTED_DATE,            // 上市日
  PURCHASE_LABEL,         // 是否可申购
  INSTITUTION_TYPE,       // 企业类型
  ANNOUNCE_DATE,          // 公告日
  COUPON_RATE,            // 票面利率
  MATURITY_TERM_END,      // 期限，按总期限排序
  MATURITY_TERM_2D,       // 期限，仅用于发行日历-利率债
  TERM_TO_MATURITY,       // 期限，按行权期限排序
  VLIQUIDITY,             // 流动性

  AREA,                 // 地区
  SECTOR,               // 行业
  INTEREST_START_DATE,  // 起息日

  kInstitutionName,     // 机构简称
  kIssueEndTime,        // 截标时间
  kActualIssureAmount,  // 实际发行量
  kCouponType,          // 利率方式，固息/浮息
  kRateType,            // 利率类型，固息/SHIBOR/LPR等
  kIssuerAmount,  // 首先取实际发行量，无值时取计划发行量，

  kDuration,                 // 久期
  kBid_EstPrice,             // bid-中债估值
  kBid_EstPrice_Settlement,  // 带清算速度筛选的 bid-中债估值
  kEstPrice_Ofr,             // 中债估值-Ofr
  kEstPrice_Ofr_Settlement,  // 带清算速度筛选的 中债估值-ofr
  kOutlook,                  // 展望

  kInstitutionFullName,  // 发行人机构全称

  // 募集时段存在时，日期显示--排序，超级新债通，信用债、私募债,add bushion
  // 20150908
  ISSUE_DATE_IsuPeriod,     // 发行日,募集时段存在时,数值等于--
  PAYMENT_DATE_IsuPeriod,   // 缴款日,募集时段存在时,数值等于--
  LISTED_DATE_IsuPeriod,    // 上市日,募集时段存在时,数值等于--
  ANNOUNCE_DATE_IsuPeriod,  // 公告日,募集时段存在时,数值等于--
  INTEREST_DATE_IsuPeriod,  // 起息日,募集时段存在时,数值等于--

  kIssuerPeriod,  // 募集时段
  kIssueRate,     // 发行利率
  kConvRate,      // 质押比例

  // 新增
  kTknPrice,       // 成交净价VTKNPRICE
  kCleanPriceDiv,  // 净价偏离度
  kTknYield,       // 成交收益率
  kYieldDiv,       // 收益率偏离度
  kCouponRate,     // 票面利率

  kCdcCleanPrice,  // 中债净价
  kCdcFullPrice,   // 中债全价
  kCsiVal,         // 中证估值
  kCsiCleanPrice,  // 中证净价
  kCsiFullPrice,   // 中证全价
  kOptionType,     // 含权类型
  kOptionDate,     // 行权日
  kCsi_Cdc,        // 中证一中债
  kCrossMarket,    // 跨市场
  kIndustry,       // 行业
  kIndustryEn,     // 行业英文
  kRatingAgency,   // 评级机构   rating agency

  VBondType,    // 债券类型 产品
  VBondIssuer,  // 债券发行人 发行人

  kBondGuarantor,      // 担保人
  kBondGuarantorEn,    // 担保人英文
  kBondLiquidity,      // 债券流动性
  kIssuerLiquidity,    // 主体流动性
  kOutstandingAmount,  // 债券余额

  kBid_CsiVal,             // bid-中证估值
  kBid_CsiVal_Settlement,  // 带清算速度筛选的 bid-中证估值
  kCsiVal_Ofr,             // 中证估值-ofr
  kCsiVal_Ofr_Settlement,  // 带清算速度筛选的 中证估值-ofr

  kMaturityDate,            // 到期日排序,不考虑IssuerPeriod是否有值
  kMaturityDate_IsuPeriod,  // 到期日排序,考虑IssuerPeriod是否有值

  kDeal_Cdc,  // 成交-中债
  kDeal_Csi,  // 成交-中证

  kCFETS_Buyer,        // CFETS买方
  kCFETS_BidFull,      // CFETS 全价.bid
  kCFETS_BidVol,       // CFETS bid 量
  kCFETS_BidClean,     // CFETS 净价.bid
  kCFETS_Bid,          // CFETS  bid
  kCFETS_Ofr,          // CFETS  ofr
  kCFETS_OfrClean,     // CFETS 净价.ofr
  kCFETS_OfrVol,       // CFETS ofr 量
  kCFETS_OfrFull,      // CFETS 全价.ofr
  kCFETS_Seller,       // CFETS 卖方
  kCFETS_Bid_CdcVal,   // CFETS bid - 中债估值
  kCFETS_CdcVal_Ofr,   // CFETS 中债估值 - ofr
  kCFETS_Bid_CsiVal,   // CFETS bid-中证估值
  kCFETS_CsiVal_Ofr,   // CFETS 中证估值 - ofr
  kCFETS_Update_Time,  // CFETS 更新时间

  kCFETS_Deal_Price,         // CFETS 最新价
  kCFETS_Deal_Increase,      // CFETS 涨跌
  kCFETS_Deal_WeightedMean,  // CFETS 加权平均
  kCFETS_Deal_Open,          // CFETS 开盘
  kCFETS_Deal_High,          // CFETS 最高
  kCFETS_Deal_Low,           // CFETS 最低
  kCFETS_Deal_PreClose,      // CFETS 昨收
  kCFETS_Deal_Vol,           // CFETS 成交量
  kCFETS_Deal_CDC,           // CFETS 成交-中债
  kCFETS_Deal_CSI,           // CFETS 成交-中证
  kCFETS_Deal_Time,          // CFETS 更新时间

  MyAttBidVol,  // 我的关注bidval
  MyAttBid,     // 我的关注bid
  MyAttOfr,     // 我的关注ofr
  MyAttOfrVol,  // 我的关注ofrval

  broker_market_Price,        // 全市场broker高开低收 - 最新成交
  broker_market_UpDownPrice,  // 至今涨幅
  broker_market_Increase,     // 涨跌
  broker_market_Open,         // 开盘
  broker_market_High,         // 最高
  broker_market_Low,          // 最低
  broker_market_PreClose,     // 昨收
  broker_market_DealCount,    // 成交笔数
  broker_market_AttBid,       // 我的关注bid  最新报价
  broker_market_AttOfr,       // 我的关注ofr  最新报价
  broker_market_BidOfr,       // 买家/卖家
  broker_market_CDCDeal,      // 成交-中债
  broker_market_CSIDeal,      // 成交-中证
  broker_market_UpdateTime,   // 最后更新
  fisse_deal_netprice,        // 上证固收成交净价
  fisse_deal_fullprice,       // 上证固收成交全价
  fisse_deal_yield,           // 上证固收成交收益率
  fisse_deal_volumn,          // 上证固收成交量
  fisse_deal_amount,          // 上证固收成交额

  kTknCleanCleanPrice,  // 成交净价

  kABSBondBaseType,      // ABS基础资产
  kABSBondSeries,        // ABS系列
  kABSBondFinancier,     // ABS实际融资人
  kABSBondIssuer,        // ABS发行人
  kBondMainUnderwriter,  // 主承机构

  VBondIssueType,     // 发行
  VMunicipalBond,     // 地方债类型
  kABRecommendPrice,  // AB推荐定价

  // 上交所行情页面
  kSHEX_SHCOL_SOURCE,
  kSHEX_BID_VOL,
  kSHEX_BID_YIELD,
  kSHEX_BID_PRICE,
  kSHEX_OFR_PRICE,
  kSHEX_OFR_YIELD,
  kSHEX_OFR_VOL,
  kSHEX_BID_OFR,
  kSHEX_OFR_BID,

  kSHEX_TKN_PRICE,
  kSHEX_TKN_YIELD,
  kSHEX_PRECLOSE_RPICE,
  kSHEX_CHANGE,
  kSHEX_CHANGE_PERCENT,
  kSHEX_TKN_VOL,
  kSHEX_TKN_AMOUNT,
  kSHEX_TKN_CDCYield,      // 非可转债 成交收益率-中债收益率
  kSHEX_TKN_CDCFullPrice,  // 可转债   成交全价-中债全价
  kSHEX_TKN_CSIYield,      // 非可转债 成交收益率-中证收益率
  kSHEX_TKN_CSIFullPrice,  // 可转债   成交全价-中证全价
  kSHEX_MODIFY_TIME,       // 更新时间

  // 以下为自定义排序类型
  kUserSortKey1 = 1000,  // 自定义排序类型
  kUserSortKey2,
  kUserSortKey3,
  kUserSortKey4,
  kUserSortKey5,
  kUserSortKey6,
  kUserSortKey7,
  kUserSortKey8,
  kUserSortKey9,
  kUserSortKey10,
  kUserSortKey11,
  kUserSortKey12,
  kUserSortKey13,
  kUserSortKey14,
  kUserSortKey15,
  kUserSortKey16,
  kUserSortKey17,
  kUserSortKey18,
  kUserSortKey19,
  kUserSortKey20,
};

//-------------------------------------------------------------------------
// Summary:
// 		SSortInfo排序结构体
//-------------------------------------------------------------------------
struct S_BONDLIB_EXPORT CSortInfo {
 public:
  CSortInfo(int nSortKey = VBOND_NULL, bool bDesc = false)
      : m_nSortKey(nSortKey), m_bDesc(bDesc) {}

  int m_nSortKey;  // 排序类型
  bool m_bDesc;    // true表示降序
};

class S_BONDLIB_EXPORT CSortInfoManager {
 public:
  CSortInfoManager() : m_bDirectReverse(false) {}

  ~CSortInfoManager() {}

  //-------------------------------------------------------------------------
  // Summary:
  // 		初始化排序规则数据
  // Parameters:
  // 		nSortKey - 排序规则
  // 		bDesc - true表示降序
  // Returns:
  // 		void
  //-------------------------------------------------------------------------
  void InitData(int nSortKey = VMODIFY_TIME, bool bDesc = true);

  //-------------------------------------------------------------------------
  // Summary:
  // 		更新数据
  //      规则：
  //          1、按下Ctrl键，若之前sortKey存在，则排序规则取反且放入最后位置，否则加入到最后面
  //          2、没有按下Ctrl键,清除旧数据，只存最新一条排序规则,若之前sortKey存在，则排序规则取反
  // Parameters:
  // 		bPressCtrlKey - true表示按下了CTRL键
  // 		nSortKey - 排序key
  // 		bDesc - true表示降序
  // Returns:
  // 		void
  //-------------------------------------------------------------------------
  void AddOrUpdate(bool bPressCtrlKey, int nSortKey, bool bDesc = false);

  //-------------------------------------------------------------------------
  // Summary:
  // 		根据排序key得到排序数据
  // Parameters:
  // 		nSortKey - 排序key
  // 		sortInfo - 排序数据
  // Returns:
  // 		若成功得到返回true,否则返回false
  //-------------------------------------------------------------------------
  bool GetSortInfo(int nSortKey, CSortInfo &sortInfo) const;

  //-------------------------------------------------------------------------
  // Summary:
  // 		判断是否含有排序类型
  // Parameters:
  // 		nSortKey - 排序Key
  // Returns:
  // 		若有返回true,否则返回false
  //-------------------------------------------------------------------------
  bool HasSortKey(int nSortKey) const;
  bool HasSortKey(const std::vector<int> &vecSortKey) const;

  int GetSize() const { return (int)m_vecSortInfo.size(); }
  void Clear() { m_vecSortInfo.clear(); }

  const std::vector<CSortInfo> &GetData() const { return m_vecSortInfo; }

  //-------------------------------------------------------------------------
  // Summary:
  // 		设置是否直接反序排序
  // Parameters:
  // 		bStatus -
  // Returns:
  // 		若成功返回true,否则返回false
  //-------------------------------------------------------------------------
  void SetDirectReverse(bool bStatus = false) { m_bDirectReverse = bStatus; }
  bool IsDirectReverse() const { return m_bDirectReverse; }
  bool IsSatisfyDirectReverse() const;

  //-------------------------------------------------------------------------
  // Summary:
  // 		设置公司名称，价格等参数，与公司有关
  // Parameters:
  // 		sSortCorp - 公司名称。（broker 全部排序时，传入空值）
  // Returns:
  // 		void
  //-------------------------------------------------------------------------
  void SetSortCorp(const std::string &sSortCorp) { m_sSortCorp = sSortCorp; };
  const char *GetSortCorp() const { return m_sSortCorp.c_str(); }

 private:
  //-------------------------------------------------------------------------
  // Summary:
  // 		添加或者更新，若存在，则排序规则取反且放入最后位置，否则加入到最后面
  // Parameters:
  // 		nSortKey - 排序key
  // 		bDesc - true表示降序
  // Returns:
  //
  //-------------------------------------------------------------------------
  void AddOrUpdateEx(int nSortKey, bool bDesc = true);

 public:
  std::vector<CSortInfo> m_vecSortInfo;  // 排序内容

 private:
  std::string m_sSortCorp;  // 公司名称，broker的id
  bool
      m_bDirectReverse;  // 直接反序，若只选择一列，且与上次列项相同与反序时，可以直接进行反序操作。
};